#ifndef CENTRAL_CACHE_H
#define CENTRAL_CACHE_H

#include "./Common.h"

namespace MemoryPool
{
    class CentralCache
    {
    public:
        static CentralCache &getInstance();

        void *allocRange(const size_t needRangeIndex);
        // 上面是上层获取一个range，下面是上层批量获取多个range
        void *allocRange2(const size_t needRangeIndex, const size_t needRangeNum);
        void deallocRange(void *needRangeStart, const size_t needRangeIndex, const size_t needRangeSize);

    private:
        CentralCache();
        CentralCache(const CentralCache &) = delete;
        CentralCache &operator=(const CentralCache &) = delete;
        CentralCache(const CentralCache &&) = delete;
        CentralCache &operator=(const CentralCache &&) = delete;

        // 上层需要5B，会Common.h按照对齐数8B计算index为0，则从freeRanges_[0]给上层
        // 又由分割链表操作+freeRanges_[needRangeIndex].store()申请后加入freeRanges_知，
        // freeRanges_[0]存的是8B链表，freeRanges_[1]存的是16B链表...
        // 从页缓存获取内存
        void *allocFromPageCache(const size_t needSize, size_t &needPageNum);
        // 每次从PageCache获取span大小（以页4KB为单位）
        static const size_t SPAN_PAGES = 8;

        // 下层PageCache的span->组织成range空闲链表
        std::array<std::atomic<void *>, SizeManager::FREE_LIST_NUM> freeRanges_;
        // 用于同步的自旋锁，每链表一个
        std::array<std::atomic_flag, SizeManager::FREE_LIST_NUM> locks_;
    };
} // namespace MemoryPool

#endif // CENTRAL_CACHE_H